package groep1.filter;

import groep1.ObjectList;

import groep1.ObjectRepresentation;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

import bluej.debugmgr.inspector.FieldInfo;

public class NotFilter extends LogicalFilter {

	public NotFilter(String regex1, HashSet<ObjectRepresentation> objects) {
		super(regex1, objects);
	}

	@Override
	public HashMap<String, List<FieldInfo>> join() {
		HashMap<String, List<FieldInfo>> niet =  super.side1.join();
		HashMap<String, List<FieldInfo>> wel = new HashMap<String, List<FieldInfo>>();
		HashSet<ObjectRepresentation> set = ObjectList.getInstance().getObjectRepresentations();
		for (ObjectRepresentation obj: set) {
			if (!niet.containsKey(obj.getUniqueKey())) { // 'niet' bevat het object niet, dus het moet in 'wel' zitten
				wel.put(obj.getUniqueKey(), obj.getFieldList());
			} else { // 'niet' bevat het object wel
				filterFields(niet, wel, obj);
			}
		}
		return wel;
	}

	/**
	 * Filter the fields of obj. The fields of obj that are not in 'niet' will be put in 'wel'.
	 * 
	 * @param	niet
	 * 			| The fields that need to be filtered out.
	 * @param	wel
	 * 			| The fields that are left after filtering.
	 * @param	obj
	 * 			| The object that holds the fields.
	 */
	protected void filterFields(HashMap<String, List<FieldInfo>> niet,
			HashMap<String, List<FieldInfo>> wel, ObjectRepresentation obj) {
		List<FieldInfo> fieldInfoListNiet = niet.get(obj.getUniqueKey());
		List<FieldInfo> fieldInfoListwel = obj.getFieldList();
		Iterator<FieldInfo> iterator = fieldInfoListwel.iterator();// alle velden van het object
		while (iterator.hasNext()) { // overbodige velden verwijderen
			if (fieldInfoListNiet.contains(iterator.next())) // als het veld in 'niet' zit, mag het niet in 'wel' zitten
				iterator.remove();
		}
//		if (fieldInfoListwel.size() > 0) // als er nog velden overblijven, toevoegen aan lijst
			wel.put(obj.getUniqueKey(), fieldInfoListwel);
	}
}
